package miage.gestioncabinet.coredb;

import java.util.Calendar;
import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import miage.gestioncabinet.api.Consultation;
import miage.gestioncabinet.api.GestionCabinetException;
import miage.gestioncabinet.api.Medecin;
import miage.gestioncabinet.api.Patient;
import miage.gestioncabinet.api.PlanningRemoteService;
import miage.gestioncabinet.api.Utilisateur;

@Stateful
@Remote(PlanningRemoteService.class)
public class PlanningServiceDB implements PlanningRemoteService{
	
	private UtilisateurDB utilisateur;
	private MedecinDB medecin;
	private Calendar dateDebut;
	private Calendar dateFin;
	private ConsultationDB consultation;
	
	@PersistenceContext
	private EntityManager em;
	
	@Override
	/**
	 * Retourne l'utilisateur authentifié
	 * @return Utilisateur l'utilisateur
	 */
	public Utilisateur getUtilisateur() {
		return this.utilisateur;
	}

	@Override
	/**
	 * Retourne la liste des médecins du cabinet
	 * @return la liste des médecins
	 */
	public List<Medecin> rechercherMedecins() throws GestionCabinetException {
		Query query = em.createNamedQuery("rechercherMedecins");
		@SuppressWarnings("unchecked")
		List<Medecin> listeMedecins = query.getResultList();
		return listeMedecins;
	}

	@Override
	/**
	 * Recherche un patient par un mot clé
	 * @return List<Patient> la liste des patients
	 */
	public List<Patient> rechercherPatients(String keyword) throws GestionCabinetException {
		Query query = em.createNamedQuery("rechercherPatients");
		query.setParameter("keyword", keyword);
		@SuppressWarnings("unchecked")
		List<Patient> patients = query.getResultList();
		return patients;
	}

	@Override
	/**
	 * Retourne la date de début de période des rendez-vous du médecin courant
	 * @return Calendar la date de début des consultations
	 */
	public Calendar getDateDebut() {
		return this.dateDebut;
	}

	@Override
	/**
	 * Modifie la date de début de période des rendez-vous du médecin courant
	 */
	public void setDateDebut(Calendar date) {
		this.dateDebut = date;
	}

	@Override
	/**
	 * Retourne la date de fin de période des rendez-vous du médecin courant
	 * @return Calendar la date de fin des consultations
	 */
	public Calendar getDateFin() {
		return this.dateFin;
	}

	@Override
	/**
	 * Modifie la date de fin de période des rendez-vous du médecin courant
	 */
	public void setDateFin(Calendar date) {
		this.dateFin = date;
	}

	@Override
	/**
	 * Retourne le médecin courant
	 * @return Medecin le médecin courant 
	 */
	public Medecin getMedecin() {
		return this.medecin;
	}

	@Override
	/**
	 * Modifie le médecin courant
	 */
	public void setMedecin(Medecin medecin) {
		em.persist(this.medecin);	
	}

	@Override
	/**
	 * Lister les rendez-vous du médecin courant sur la période correspondante
	 * @return List<Consultation> la liste des rendez-vous
	 */
	public List<Consultation> listerRdv() {
		Query query = em.createNamedQuery("listerRdv");
		query.setParameter("medecin", this.medecin);
		query.setParameter("heureDeb", this.dateDebut);
		query.setParameter("heureFin", this.dateFin);
		@SuppressWarnings("unchecked")
		List<Consultation> rdv = query.getResultList();
		return rdv;
	}

	@Override
	/**
	 * Retourne le rendz-vous de consultation courant
	 * @return Consultation la consultation courante
	 */
	public Consultation getRdvCourant() {
		return this.consultation;
	}

	@Override
	/**
	 * Modifie le rendez-vous de consultation courant
	 */
	public void setRdvCourant(Consultation rdv) {
		em.persist(rdv);
	}

	@Override
	/**
	 * Créer un nouveau rendez-vous de consultation
	 * @return Consultation la consultation créée
	 */
	public Consultation creerRdv(Calendar date) {
		ConsultationDB c = new ConsultationDB();
		c.setDateRdv(date);
		em.persist(c);
		return c;
	}

	@Override
	/**
	 * Sauvegarde le rendez-vous de consultation courant
	 * @return Consultation la consultation créée
	 */
	public Consultation enregistrerRdv() throws GestionCabinetException {
		em.persist(this.consultation);
		return consultation;
	}

	@Override
	/**
	 * Suppression du rendez-vous courant
	 */
	public void supprimerRdv() throws GestionCabinetException {
		em.remove(this.consultation);
	}

}
